//package com.leesche.zcsp.node.net.service.impl;
//
//
//import java.io.BufferedReader;
//import java.io.IOException;
//import java.io.InputStreamReader;
//import java.io.OutputStreamWriter;
//import java.io.PrintWriter;
//import java.net.Socket;
//import java.nio.ByteBuffer;
//
//import javax.net.ssl.SSLSocket;
//
//import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
//import org.apache.log4j.Logger;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//
//import com.alibaba.fastjson.JSONObject;
//import com.leesche.zcsp.node.net.service.GizwitsService;
//import com.leesche.zcsp.node.net.service.NetService;
//import com.leesche.zcsp.node.net.service.data.SynchronizeMgr;
//import com.leesche.zcsp.node.utils.ConfigKit;
//import com.leesche.zcsp.node.utils.MySecureProtocolSocketFactory;
//import com.leesche.zcsp.node.utils.OpCode;
//import com.leesche.zcsp.node.utils.PayConfig;
//import com.leesche.zcsp.node.utils.StrKit;
//import com.leesche.zcsp.node.web.model.PubDevice;
//import com.leesche.zcsp.node.web.service.PubDeviceService;
//
//@Service
//public class GizwitsServiceImpl implements GizwitsService {
//	
//	@Autowired
//	public PubDeviceService pubDeviceService; 
//	
//	private static final Logger LOGGER = Logger.getLogger(GizwitsServiceImpl.class);
//	private static final int TICK = 240000;
//
//	@Autowired
//	NetService netService;
//	
//	class SendThread extends Thread {
//
//		private Socket socket;
//		private boolean isLogin = false;
//		private Long currentTime; // 用于定时器的
//
//		public SendThread(Socket socket) {
//			this.socket = socket;
//		}
//
//		public void sendMsg(String msg) throws IOException {
//			PrintWriter pw = new PrintWriter(new OutputStreamWriter(
//					socket.getOutputStream()));
//			pw.write(msg);
//			pw.flush();
//		}
//
//		@Override
//		public void run() {
//			if (currentTime == null) {
//				currentTime = System.currentTimeMillis();
//			}
//			while (true) {
//				try {
//					Thread.sleep(1);
//				} catch (InterruptedException e1) {
//					// TODO Auto-generated catch block
//					e1.printStackTrace();
//				}
//				try {
//					String send = "";
//					if (!isLogin) {
//						send = getLogin();
//						isLogin = true;
//						sendMsg(send);
//					} else {
//						if (System.currentTimeMillis() - currentTime > TICK) {
//							currentTime = System.currentTimeMillis();
//							send = getSend();
//							sendMsg(send);
//							LOGGER.info("发送心跳包");
//						}
//					}
//				} catch (Exception e) {
//					e.printStackTrace();
//				}
//			}
//		}
//
//		public String getSend() throws InterruptedException {
//			// 鍥涘垎閽熷彂閫佷竴娆″績璺�
//			return "{\"cmd\": \"enterprise_ping\"}\n";
//		}
//
//		public String getLogin() throws InterruptedException {
//			Thread.sleep(1000);
//			String data = "{\"cmd\": \"enterprise_login_req\",\"data\": {\"enterprise_id\": \"#enterprise_id\",\"enterprise_secret\": \"#enterprise_secret\",\"prefetch_count\": 50}}\n";
//			data = data.replace("#enterprise_id",
//					ConfigKit.get("gizwits_enterprise_id")).replace(
//					"#enterprise_secret",
//					ConfigKit.get("gizwits_enterprise_secret"));
//			return data;
//		}
//	}
//
//	class ReceiveThread extends Thread {
//		private Socket socket;
//
//		public ReceiveThread(Socket socket) {
//			this.socket = socket;
//		}
//
//		@Override
//		public void run() {
//
//			while (true) {
//				try {
//					BufferedReader reader = new BufferedReader(
//							new InputStreamReader(socket.getInputStream(),
//									"UTF-8"));
//					String line = reader.readLine();
//					if (!StrKit.isBlank(line)) {
//						System.out.println(line);
//						reply(socket, line);
//
//					}
//				} catch (Exception e) {
//					e.printStackTrace();
//				}
//			}
//		}
//		
//		//解析出具体的内容
//		public byte[] parse(String context)
//		{
//			ByteBuffer buffer = NetServiceImpl.decode(context);
//			buffer.getInt();
//			int len = 0;
//			int position = buffer.position();
//			len = buffer.get() & 0xff;
//
//			if (0 != buffer.get() || buffer.getShort() != 145) {
//				buffer.position(position);
//				len = buffer.getShort();
//
//				if (0 != buffer.get() || buffer.getShort() != 145) {
//					buffer.position(position);
//					byte src[] = { 0, 0, 0, 0 };
//					buffer.get(src, 1, 3);
//					int offset = 0;
//					len = (int) (((src[offset] & 0xFF) << 24)
//							| ((src[offset + 1] & 0xFF) << 16)
//							| ((src[offset + 2] & 0xFF) << 8) | (src[offset + 3] & 0xFF));
//				}
//			}
//			buffer.get(); // 0x06 透传数据
//			byte data[] = new byte[len - 1 - 2 - 1 ];
//			buffer.get(data);
//			return data;
//		}
//
//		public void reply(Socket socket, String line) {
//			try {
//
//				JSONObject json = JSONObject.parseObject(line);
//				JSONObject jsonObj = json.getJSONObject("data");
//				String did = json.getString("did");
//
//				if (jsonObj != null) {
//					String context = jsonObj.getString("raw");
//					LOGGER.info("context:" + context);
//					if (context != null) {
//
//						byte data[] = parse(context);
//						String key = "123";
//						byte decode[] = NetServiceImpl.decrypt(data, key);
//						LOGGER.info("收到机智云 value:"
//								+ NetServiceImpl.bytes2HexString(decode));
//						handle(ByteBuffer.wrap(decode), did);
//
//					}
//
//					//每次都要回复后, 都要发送这个协议,否则会断线了
//					if (json.getString("delivery_id") != null) {
//						String send = "{\"cmd\": \"enterprise_event_ack\",\"delivery_id\": "
//								+ json.getString("delivery_id") + "}\n";
//						PrintWriter pw = new PrintWriter(
//								new OutputStreamWriter(socket.getOutputStream()));
//						pw.write(send);
//						pw.flush();
//						LOGGER.info("enterprise_event_ack json:" + send);
//					}
//				}
//			} catch (Exception e) {
//				e.printStackTrace();
//			}
//		}
//	}
//
//	public void handle(ByteBuffer buffer, String did) {
//		int opCode = buffer.getInt();
//		
//		LOGGER.info("OPCODE:"+opCode);
//		
//		if (opCode == OpCode.BUGREQ) {
//			// 故障上报
//			int id = buffer.getInt();
//			// int device = buffer.getInt();
//			short bugType = buffer.getShort();
//			long time = buffer.getLong();
//		} else if (opCode == OpCode.BUYREQ) {
//			// 购买货币是否同步
//			int id = buffer.getInt();
//			byte b = buffer.get();
//			int isbuy = NetServiceImpl.getFromByte(b, 0, 1);
//
//			long time = buffer.getLong();
//		} else if (opCode == OpCode.CLOSEREQ) {
//			// 是否关闭同步
//			int num = buffer.getInt();
//			byte temp = buffer.get();
//			byte isSucess = NetServiceImpl.getFromByte(temp, 0, 1);
//			long time = buffer.getLong();
//			SynchronizeMgr.notify(did, opCode, isSucess == 1 ? true : false);
//			
//		} else if (opCode == OpCode.GETREQ) {
//			// int device = buffer.getInt();
//			// 获取信息
//			int length = buffer.getInt();
//			int id = buffer.getInt();
//			short money = buffer.getShort();
//			short payMoney = buffer.getShort();
//			short coinCount = buffer.getShort();
//			long time = buffer.getLong();
//			short count = buffer.getShort();
//			byte data = buffer.get();
//
//			byte payGate = NetServiceImpl.getFromByte(data, 0, 1);
//			byte coinGate = NetServiceImpl.getFromByte(data, 1, 1);
//			byte isUpdate = NetServiceImpl.getFromByte(data, 2, 1);
//			byte acount = NetServiceImpl.getFromByte(data, 3, 2);
//			byte payType = NetServiceImpl.getFromByte(data, 5, 2);
//		} else if (opCode == OpCode.GIVECOINREG) {
//			// 吐货币
//			int num = buffer.getInt();
//			byte temp = buffer.get();
//			byte isSucess = NetServiceImpl.getFromByte(temp, 0, 1);
//			long time = buffer.getLong();
//			SynchronizeMgr.notify(did, opCode, isSucess == 1 ? true : false);
//			
//		} else if (opCode == OpCode.POINTREQ) {
//			// 单点同步
//			int id = buffer.getInt();
//			// int device = buffer.getInt();
//			short money = buffer.getShort();
//			short coin = buffer.getShort();
//			short gift = buffer.getShort();
//			long time = buffer.getLong();
//			int deviceType = buffer.getInt();
//			short encodeType = buffer.getShort();
//
//			byte little = buffer.get();
//			byte payType = NetServiceImpl.getFromByte(little, 0, 2);
//			byte isUpdate = NetServiceImpl.getFromByte(little, 2, 1);
//			byte length = NetServiceImpl.getFromByte(little, 3, 2);
//
//			byte lenContent[] = new byte[length];
//			buffer.get(lenContent);
//
//		} else if (opCode == OpCode.UPDATEKEYREQ) {
//			// 单点同步是否成功
//			int num = buffer.getInt();
//			byte temp = buffer.get();
//			byte isSucess = NetServiceImpl.getFromByte(temp, 0, 1);
//			long time = buffer.getLong();
//			SynchronizeMgr.notify(did, opCode, isSucess == 1 ? true : false);
//			
//		} else if (opCode == OpCode.STARTUPREQ) {
//			// 启动信令是否成功
//			int num = buffer.getInt();
//			byte temp = buffer.get();
//			byte isSucess = NetServiceImpl.getFromByte(temp, 0, 1);
//			long time = buffer.getLong();
//			SynchronizeMgr.notify(did, opCode, isSucess == 1 ? true : false);
//			
//		} else if (opCode == OpCode.UPDATESysREQ) {
//			// 更新系统参数是否成功
//			int num = buffer.getInt();
//			byte temp = buffer.get();
//			byte isSucess = NetServiceImpl.getFromByte(temp, 0, 1);
//			long time = buffer.getLong();
//			SynchronizeMgr.notify(did, opCode, isSucess == 1 ? true : false);
//			
//		} else if (opCode == OpCode.UPLOADIMEIREQ) {
//			int len = buffer.getShort();
//			byte data[] = new byte[len];
//			buffer.get(data);
//			String imei = new String(data);
//			
//			Short macLen = buffer.getShort();
//			byte macData[] = new byte[macLen];
//			buffer.get(macData);
//			String mac = new String(macData);
//			
//			PubDevice pubDevice = new PubDevice();
//			pubDevice.setMac(mac);
//			pubDevice.setImme(imei);
//			pubDeviceService.insertSelective(pubDevice);
//			
//			
//		} else if (opCode == OpCode.isOnLineReq)
//		{
//			SynchronizeMgr.notify(did, opCode, true);
//		}
//	}
//
//	public void start() {
//		try {
//			ProtocolSocketFactory fcty = new MySecureProtocolSocketFactory();
//			SSLSocket socket = (SSLSocket) fcty.createSocket(
//				PayConfig.GIZWITSZAPI, 2015);
//			socket.setKeepAlive(true);
//
//			SendThread sendThread = new SendThread(socket);
//			sendThread.start();
//			ReceiveThread receiveThread = new ReceiveThread(socket);
//			receiveThread.start();
//
//			LOGGER.info("send thread:" + sendThread.getName());
//			LOGGER.info("receive thread:" + receiveThread.getName());
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//	}
//
//}
